package reservation.v2;

/**
 * Classe Simulator : modélisation du fonctionnement des réservations par un batterie d'échanges entre
 * toutes les composantes existantes des classes éponymes au projet
 * 
 * @author Alexandre Boursier and Jerome Boursier
 * @version 2011.11.20
 */

import java.io.IOException;
import java.text.ParseException;
import java.util.*;

public class Simulator {

    /**
     * Demander à l'utilisateur d'appuyer sur une touche pour continuer
     * 
     * @throws IOException
     */
    public static void continuer() throws IOException
    {
        System.out.println("Appuyez sur une touche pour continuer...");
        System.in.read();
        System.out.println("\n\n\n\n\n\n\n\n\n\n");   
    }

    /**
     * Simuler des actions d'aministrateur sur le serveur courant
     * 
     * @param args
     * @throws NegativeValueException 
     * @throws StartStopException 
     * @throws NullPointerException 
     * @throws IOException 
     * @throws ParseException 
     * @throws NumberFormatException 
     */
    public static void main(String[] args) throws NullPointerException, IOException,
    NumberFormatException, NegativeValueException, StartStopException, ParseException  {

        // Créer un client administrateur et des clients de réservation
        Client customer = new Client("aboursie", "Boursier", "Alexandre");
        Client customer2 = new Client("jboursie", "Boursier", "Jerome");
        Admin admin = new Admin("ba900450",new Serveur());
        Transport t0 = new Transport(TypeTransport.SOUCOUPE_VOLANTE, 1);    
        Trajet tr0 = new Trajet(Ville.NICE, Ville.PARIS, 
                new GregorianCalendar(2011, Calendar.DECEMBER, 20, 18, 21).getTime(), t0);


        System.out.println("Simulation de réservation de transports");
        continuer();

        // Créer un nouveau serveur et le rendre actif
        // Créer un nouveau fichier associé aux réservations
        System.out.println("Création du serveur");
        admin.getServeur().init();

        continuer();

        System.out.println("Ouverture du serveur");
        admin.getServeur().open();

        continuer();

        System.out.println("Ajout d'un nouveau transport");
        // Ajouter un nouveau transport à la base de données
        // Transport id : 0
        admin.getServeur().add(t0);

        continuer();

        System.out.println("Ajout d'un nouveau trajet");
        // Créer un nouveau trajet sans voyageurs utilisant ce transport
        // Trajet id : 0
        admin.getServeur().add(tr0);

        continuer();;

        System.out.println("Demander reservation pour le client aboursie");
        // Ajouter un client à ce transport
        customer.demanderReservation(admin.getServeur().obtenirTrajet(0));

        continuer();

        System.out.println("Demander reservation pour le client jboursie ");
        // Ajouter un client n'ayant pas le droit de s'inscrire 
        // Plus de places dans le trajet cible
        customer2.demanderReservation(admin.getServeur().obtenirTrajet(0));

        continuer();

        System.out.println("Modification du nombre de places du transport id:0");
        // Modifier le nombre de places de la soucoupe volante
        admin.getServeur().obtenirTransport(t0.getIdentTransport()).setCapacite(5);
        System.out.println(t0);

        continuer();

        System.out.println("Réiterer l'inscription de jboursie au même trajet");
        // Inscrire l'identifiant jboursie à nouveau
        customer2.demanderReservation(admin.getServeur().obtenirTrajet(0));

        continuer();

        System.out.println("Afficher les trajets courants et leurs informations");
        // Afficher les trajets courants et leurs informations
        admin.getServeur().listeTrajets();

        continuer();

        System.out.println("Tenter d'inscrire un client déjà inscrit : aboursie");
        // Tenter d'inscrire un client déjà inscrit : aboursie
        customer.demanderReservation(admin.getServeur().obtenirTrajet(0));

        continuer();

        System.out.println("Fermer le serveur");
        // Fermer le serveur
        admin.getServeur().close();

        continuer();

        System.out.println("Ouvrir le serveur et recharger toutes les informations");
        admin.getServeur().open();

        continuer();

        System.out.println("Afficher le contenu du fichier en ce qui concerne les trajets");
        admin.getServeur().listeTrajets();

        continuer();

        System.out.println("Ajouter un nouveau trajet et l'associer au même transport" +
                " (idTrajet : 1 / idTransport : 0)");
        Trajet tr1 = new Trajet(Ville.NICE,Ville.BERLIN, 
                new GregorianCalendar(2011, Calendar.DECEMBER, 20, 18, 21).getTime(), t0); 

        // Trajet id : 1
        admin.getServeur().add(tr1);

        continuer();

        System.out.println("Récupérer tous les transports effectuant des trajets au départ de Nice");
        // Récupérer tous les trajets ayant la ville de départ NICE
        admin.getServeur().obtenirTransports(Ville.NICE);

        continuer();

        System.out.println("Obtenir tous les trajets effectués par le transport d'id 0");
        // Vérifier que le transport est bien affecté à deux trajets (id = 0)
        admin.getServeur().obtenirTrajets(admin.getServeur().obtenirTransport(0));

        continuer();

        System.out.println("Obtenir tous les trajets d'une date donnée : 20/11/2011 à 18h21 ");
        // Obtenir tous les trajets d'une date donnée
        admin.getServeur().obtenirTrajets(new GregorianCalendar(2011, Calendar.DECEMBER, 20, 18, 21).getTime());

        continuer();

        System.out.println("Modifier la date du trajet id:1");
        tr1.setDate(new GregorianCalendar(2012, Calendar.DECEMBER, 20, 18, 21).getTime());
        System.out.println(tr1);

        continuer();

        System.out.println("Demander reservation pour le client aboursie ");
        customer.demanderReservation(admin.getServeur().obtenirTrajet(1));

        continuer();

        System.out.println("Obtenir les trajets dans lesquels apparait aboursie");
        admin.getServeur().obtenirTrajets(customer);

        continuer();

        System.out.println("Obtenir les trajets dans lesquels apparait jboursie");
        admin.getServeur().obtenirTrajets(customer2);

        continuer();

        System.out.println("Supprimer le trajet d'id:1");
        admin.getServeur().delete(tr1);

        continuer();

        System.out.println("Obtenir les trajets dans lesquels apparait aboursie");
        admin.getServeur().obtenirTrajets(customer);

        continuer();

        System.out.println("Obtenir tous les trajets effectués par le transport d'id 0 " +
                "(et donc les voyageur associés)");
        // Vérifier que le transport est bien affecté à deux trajets (id = 0)
        admin.getServeur().obtenirTrajets(admin.getServeur().obtenirTransport(0));

        continuer();

        System.out.println("Supprimer le transport (et donc son dernier trajet associé");
        admin.getServeur().delete(t0);
        continuer();
        
        System.out.println("Fermer le serveur puis charger le fichier pour montrer qu'il ne reste plus rien");
        admin.getServeur().close();
        admin.getServeur().open();

        continuer();

        System.out.println("Fin de la simulation.");

    }

}
